package com.note.Interceptor;

import com.note.common.core.domain.model.LoginUser;
import com.note.common.core.redis.RedisCache;
import com.note.common.utils.ServletUtils;
import com.note.common.utils.ip.IpUtils;
import com.note.common.utils.spring.SpringUtils;
import com.note.constant.PvConstant;
import com.note.framework.web.service.TokenService;
import com.note.util.CalendarUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;
import java.util.Date;


/**
 * 统计日活pv
 *
 * redis删除有序集合部分过期元素
 * 最近老大让看看redis中数据类型，list中单个element元素，能不能设置过期（不是针对整个list），
 * 整个list是可以直接设置过期的。网上搜结果list单个元素不支持自动过期设置
 *
 * 使用有序集合，来实现。（每个有序集合 的成员都关联着一个评分，这个评分用于把有序集 合中的成员按最低分到最高分排列。）
 * 思路：将score 设置成时间戳，让后通过zremrangebyscore来删除
 * 总的来说，就是score 用时间戳来存，然后 zremrangebyscore 是删除这个时间戳范围内的成员，所以用zremrangebyscore的时候，传参只要传你想删除的时间戳范围即可
 */
public class PvInterceptor implements HandlerInterceptor {


    /**
     * 算pv 未登录，其实是可以当用户用浏览器第一次访问时，生成一个标记，然后放到cookie，这个标记的过期时间设置为凌晨 零点过期，然后
     * 用户在同一浏览器 访问的时候，就会带上这个cookie，判断到这个标记存在，就不用重复记录了,这样就可以统计每天的未登录pv了。
     * 当然，这种统计方法如果一个用户 用不同浏览器访问，肯定就没这么准确了
     * 在请求处理之前进行调用（Controller方法调用之前）
     *
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        TokenService tokenService = SpringUtils.getBean(TokenService.class);
        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
        String ipAddr = IpUtils.getIpAddr(request);

        RedisCache redisCache = SpringUtils.getBean(RedisCache.class);

        String date = CalendarUtil.getBeforeDateStr(0,"yyyy-MM-dd");
        ipAddr = ipAddr.replace(".", "");
        int idx = ipAddr.indexOf(":");
        if(idx >= 0){
            ipAddr = ipAddr.substring(0, idx);
        }
        long ip = Long.parseLong(ipAddr);
        //- 100000是为了减少偏移量，因为ip 代表的数字是很大的，不同的ip ，减去同一个数字，得到的肯定是唯一的
        ip = ip - 10000;
        redisCache.setbit(PvConstant.NOLOGIN_PV+":"+date, ip, true);

        if(loginUser != null){
            //用户登录了，就存用户登录的信息位图
            redisCache.setbit(PvConstant.LOGIN_PV+":"+date, loginUser.getUser().getUserId(), true);
        }
        return true;
    }






}
